package com.sky.web.example.controller;

import com.sky.common.annotation.Anonymous;
import com.sky.web.example.bean.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;

@RestController
@Anonymous
@RequestMapping("/databind")
public class DataBind {
    /**
     * 数据绑定说明：
     * - 请求参数 "username" 将会通过 URL 查询参数或表单参数传递。
     * - 例如，如果请求的 URL 是 "/getUserName?username=JohnDoe"，则方法参数 "username" 将被赋值为 "JohnDoe"。
     */
    @GetMapping("/getUserName")
    public void getUserNameAndId(String username) {
        System.out.println("username=" + username);
    }

    /**
     * 数据绑定说明：
     * - 方法参数 "request" 是通过依赖注入的方式由 Spring MVC 框架提供的，代表当前的 HTTP 请求对象。
     * - 使用 HttpServletRequest 对象可以访问请求的所有信息，包括请求 URL、头信息、参数等。
     */
    @GetMapping("/printUrl")
    public void printUrl(HttpServletRequest request) {
        // 获取请求的URL（不包括查询参数）
        StringBuffer url = request.getRequestURL();
        // 打印URL
        System.out.println("Requested URL: " + url);
    }


    /**
     * 数据绑定说明：
     * - 使用 @RequestParam 注解将请求参数 "name" 绑定到方法参数 "name" 上。
     * - 请求必须包含名为 "name" 的查询参数，否则将抛出异常。
     */
    @GetMapping("/hello1")
    public String sayHello(@RequestParam String name) {
        return "Hello, " + name + "!";
    }

    /**
     * 数据绑定说明：
     * - 使用 @RequestParam(value="username", required=false) 注解将请求参数 "username" 绑定到方法参数 "username" 上。
     * - "required=false" 表示请求中可以不包含 "username" 参数，此时 "username" 将为 null。
     * - 如果请求中包含 "username" 参数，则其值将被绑定到 "username" 变量上。
     */
    @PostMapping("/hello2")
    public String sayHello2(@RequestParam(value="username", required=false) String username) {
        return "Hello, " + username + "!";
    }

    /**
     * 数据绑定说明：
     * - 使用 @RequestParam(value="username", defaultValue="Guest") 注解将请求参数 "username" 绑定到方法参数 "username" 上。
     * - "defaultValue='Guest'" 表示如果请求中不包含 "username" 参数，则 "username" 将被赋值为 "Guest"。
     * - 如果请求中包含 "username" 参数，则其值将覆盖默认值并绑定到 "username" 变量上。
     */
    @GetMapping("/hello3")
    public String sayHello3(@RequestParam(value="username", defaultValue="Guest") String username) {
        return "Hello, " + username + "!";
    }

    /**
     * 数据绑定说明：
     * - 使用 @PathVariable 注解将 URI 模板变量 "{id}" 绑定到方法参数 "id" 上。
     * - 请求的 URI 必须匹配 "getUserInfo/{id}" 的模式，其中 "{id}" 部分将被实际的值替换并绑定到 "id" 参数上。
     * - 绑定的 "id" 参数值将用于构造返回的 User 对象。
     */
    @GetMapping("getUserInfo/{name}")
    public User getUserById(@PathVariable String name) {
        return new User(name,18);
    }

    /**
     * 数据绑定说明：
     * - 使用 @RequestBody 注解将 HTTP 请求体中的数据绑定到 User 对象上。
     * - 客户端需要发送一个 JSON 格式的 User 对象作为请求体。
     * - 方法参数 user 将会被自动填充为请求体中的对应数据。
     */
    @PostMapping("/createUser")
    public String createUser(@RequestBody User user) {
        // 在这里，user 对象已经被填充了请求体中的数据
        System.out.println("Received user: " + user);

        return "User created successfully: " + user.getName();
    }
}
